#!/bin/sh
#
#  +----------------------------------------------------------------------+
#  | PHP Version 7                                                        |
#  +----------------------------------------------------------------------+
#  | Copyright (c) The PHP Group                                          |
#  +----------------------------------------------------------------------+
#  | This source file is subject to version 3.01 of the PHP license,      |
#  | that is bundled with this package in the file LICENSE, and is        |
#  | available through the world-wide-web at the following url:           |
#  | https://php.net/license/3_01.txt                                     |
#  | If you did not receive a copy of the PHP license and are unable to   |
#  | obtain it through the world-wide-web, please send a note to          |
#  | license@php.net so we can mail you a copy immediately.               |
#  +----------------------------------------------------------------------+
#  | Authors: Sascha Schumann <sascha@schumann.cx>                        |
#  +----------------------------------------------------------------------+
#
# This script generates PHP lexer and parser files required to build PHP. The
# generated files are ignored in the Git repository and packaged during the PHP
# release process into the release installation archive download. This way the
# bison and re2c dependencies are not required to build PHP when downloading
# release archive.
#
# Usage: genfiles
#
# Environment:
#   The following environment variables can override default generators paths.
#
#     YACC    Parser generator program, default bison
#     RE2C    Lexer generator program, default re2c
#
#   For example:
#     YACC=/path/to/bison ./genfiles

# Parser generator
YACC=${YACC:-bison}
YACC="$YACC -y -l"

# Lexer generator
RE2C=${RE2C:-re2c}
RE2C_FLAGS="-i"

# Current path to return to it later. This enables running script from any path.
original_path=`pwd`

# Project root directory
project_root=`CDPATH= cd -- "$(dirname -- "$0")" && pwd -P`
cd $project_root

echo "Generating Zend parser and lexer files"
make RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" YACC="$YACC" srcdir=Zend builddir=Zend top_srcdir=. \
  -f Zend/Makefile.frag \
  Zend/zend_language_parser.c \
  Zend/zend_language_scanner.c \
  Zend/zend_ini_parser.c \
  Zend/zend_ini_scanner.c

echo "Generating phpdbg parser and lexer files"
make RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" YACC="$YACC" srcdir=sapi/phpdbg builddir=sapi/phpdbg top_srcdir=. \
  -f sapi/phpdbg/Makefile.frag \
  sapi/phpdbg/phpdbg_parser.c \
  sapi/phpdbg/phpdbg_lexer.c

echo "Generating json extension parser and lexer files"
make RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" YACC="$YACC" srcdir=ext/json builddir=ext/json top_srcdir=. \
  -f ext/json/Makefile.frag \
  ext/json/json_parser.tab.c \
  ext/json/json_scanner.c

echo "Generating PDO lexer file"
make RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" srcdir=ext/pdo builddir=ext/pdo top_srcdir=. \
  -f ext/pdo/Makefile.frag \
  ext/pdo/pdo_sql_parser.c

echo "Generating standard extension lexer files"
make RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" srcdir=ext/standard builddir=ext/standard top_srcdir=. \
  -f ext/standard/Makefile.frag \
  ext/standard/var_unserializer.c \
  ext/standard/url_scanner_ex.c

echo "Generating phar extension lexer file"
make RE2C="$RE2C" RE2C_FLAGS="$RE2C_FLAGS" srcdir=ext/phar builddir=ext/phar top_srcdir=. \
  -f ext/phar/Makefile.frag \
  ext/phar/phar_path_check.c

# Clean debug #line XY info from the bundled lexer files.
cleanup_files=" \
  ext/date/lib/parse_date.c \
  ext/date/lib/parse_iso_intervals.c \
"

for f in $cleanup_files; do
  echo "Cleaning file $f"
  cp $f $f.orig
  grep -v '^#line ' $f.orig > $f
  rm -f $f.orig
done

# Return to the original directory.
cd $original_path
